
package reversi.servidor;

import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.util.ArrayList;

import reversi.db.Conexiones;

/**
 * Servidor que acepta conexiones de clientes, crea un hilo/thread para
 * atenderlos, y espera la siguiente conexión.
 * 
 */
public class ServidorReversi {
	
	public static ArrayList<HiloDeCliente> clientes = new ArrayList<HiloDeCliente>();
	/**
	 * Instancia esta clase.
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		new ServidorReversi();
	}

	/**
	 * Se mete en un bucle infinito para ateder clientes, lanzando un hilo para
	 * cada uno de ellos.
	 */
	public ServidorReversi() {
		try {
			/*
			 * Esto abre un socket (puerto TCP) en el puerto 5557 en todas las
			 * interfaces de red de la máquina dónde se ejecute
			 */
			ServerSocket socketServidor = new ServerSocket(5557);
			
			while (true) {
				/*
				 * Esta sentencia bloquea la ejecución hasta que se reciba una
				 * conexión en el puerto del socket
				 */
				Socket socketCliente = socketServidor.accept();
				
				//Carga el driver para la conexion base de datos
				Class.forName("org.postgresql.Driver");
				Connection conPostgres = Conexiones.obtenerConexion(Conexiones.DBMS_TYPE_POSTGRES);

				/*
				 * Se instancia un thread para controlar esta conexión recién
				 * recibida de un cliente 
				 */
				HiloDeCliente nuevoCliente = new HiloDeCliente(socketCliente, conPostgres);
				//Se añade la nueva instancia al ArrayList
				clientes.add(nuevoCliente);
				//Se inicia el hilo
				nuevoCliente.start();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
